package org.jetlinks.pro.things;

import org.hswebframework.web.api.crud.entity.PagerResult;
import org.hswebframework.web.api.crud.entity.QueryParamEntity;
import org.jetlinks.core.message.ThingMessage;
import org.jetlinks.core.things.ThingProperty;
import org.jetlinks.core.things.ThingType;
import org.jetlinks.core.things.ThingsDataManager;
import org.jetlinks.pro.things.data.AggregationRequest;
import org.jetlinks.pro.things.data.PropertyAggregation;
import org.jetlinks.pro.things.data.ThingPropertyDetail;
import org.jetlinks.pro.timeseries.query.AggregationData;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import javax.annotation.Nonnull;

public interface ThingsDataRepository {

    /**
     * 保存物数据
     *
     * @param message 物消息
     * @return void
     */
    Mono<Void> save(ThingType thingType,
                    ThingMessage message);

    /**
     * 根据条件查询属性,并返回属性列表
     *
     * @param thingId 物ID
     * @param param   查询参数
     * @return 属性列表
     */
    Flux<ThingPropertyDetail> queryProperty(ThingType thingType,
                                            String thingId,
                                            QueryParamEntity param);

    /**
     * 查询指定物的属性
     *
     * @param thingType 物类型
     * @param thingId   物实例ID
     * @param property  属性
     * @param param     参数
     * @return 属性列表
     */
    Flux<ThingPropertyDetail> queryProperty(ThingType thingType,
                                            String thingId,
                                            String property,
                                            QueryParamEntity param);

    /**
     * 根据条件分页查询属性,并返回属性列表
     *
     * @param thingId 物ID
     * @param param   查询参数
     * @return 属性分页查询结果
     */
    Mono<PagerResult<ThingPropertyDetail>> queryPropertyPage(ThingType thingType,
                                                             String thingId,
                                                             String property,
                                                             QueryParamEntity param);

    /**
     * 聚合查询属性
     *
     * @param thingId    物ID
     * @param request    聚合请求
     * @param properties 属性聚合方式
     * @return 聚合查询结果
     */
    Flux<AggregationData> aggregationProperties(ThingType thingType,
                                                @Nonnull String thingId,
                                                @Nonnull AggregationRequest request,
                                                @Nonnull PropertyAggregation... properties);


}
